[Python] 黑白棋(翻转棋)小游戏
游戏介绍
黑白棋(Reversi or Othello)在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
规则
黑白棋的每颗棋子由黑白两色组成,一面白,一面黑。每次落子,把本方颜色的棋子放在棋盘的空格上,若在横、竖、斜八个方向的任一方向上有本方棋子,则被夹在中间的对手棋子全部翻转为本方棋子颜色;并且仅在可以翻转棋 子的地方才能落子。如果一方至少有一步合法棋步可下,他就必须落子,不得弃权。
棋盘已满或双方都没有棋子可下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束,将对手棋子吃光的一方获胜。
胜负判定
两位玩家轮流下棋,直到一方没有符合规则的落子位置,在这种情况下,剩下的一方 继续下棋,直到对手有了可以落子的位置。此时,恢复两者轮流下棋的顺序。如果一方落子在非法位置,则视为放弃本次对弈,对方获胜。
游戏结束的条件:
- 整个棋盘满了
- 一方的棋子已经被对方吃光
- 两名玩家都没有可以落子的棋盘格
- 一方落子在非法位置
前3种情况以棋子数目来计算胜负,棋子多的一方获胜;第四种情况判定对方获胜。
人机对弈流程
首先,程序询问用户棋盘的大小。接着,程序询问用户“计算机持黑棋还是白棋”。
在本程序中,我们用字母’X’代表黑棋, 用字母’O’代表白棋,并且假设总是黑棋玩家先走。
所以,如果计算机持黑棋,计算机就先走; 否则,程序提示人类玩家先走。
每走一步,程序输出棋盘。黑白棋玩家轮流下棋,直到一个玩家无符合规则的落子位置。
此时,程序输出信息“O player has no valid move.”(假设白棋玩家无棋可走),并且提示黑棋玩家继续下棋。
每走一步,程序除输出棋盘外,还要检测游戏是否结束。如果程序检查出游戏结束,输出输赢信息并中止程序。输赢信息可以是: “O player wins.”, “X player wins.” 或者“Draw!”. 如果用户落子非法,程序应检测到并且输出“Invalid move.”, 结束程序,宣布赢家。
计算机选择落子位置的策略
对每个可能的落子位置,都进行尝试,计算该位置的“分值”(可以翻转的对手棋子数量),分值越高则在该位置落子越有利。计算每个可能位置的分值,选择最大值位置落子。需要注意的是:可能有2个或多个棋盘格有相同的分值。这种情况下,选择行字母最小的棋盘格。如果两个棋盘格分值相同且在同一行,则选择列字母较小的棋盘格。
程序执行
代码
完整代码见
代码仓库
棋盘代码
1 | #!/usr/bin/python |
游戏逻辑
1 | #!/usr/bin/python |